#include "Registro.h"

Registro::Registro(const Registro &registro):
nombresCampos(registro.nombresCampos),
campos(registro.campos)
{
}

Registro &Registro::operator=(const Registro &registro)
{
	if (!(this==&registro))
	{
		//this->clear();		
		this->nombresCampos=registro.nombresCampos;
		this->campos=registro.campos;
	}

	return *this;
}

bool Registro::operator==(const Registro &registro) const
{
	vector<Campo>::const_iterator i;
	vector<Campo>::const_iterator j;

	i=this->campos.begin();
	j=registro.campos.begin();

	bool iguales=true;

	while (iguales && i!=this->campos.end() && j!=registro.campos.end() )
	{
		iguales=(*i==*j);
		i++;
		j++;
	}

	return iguales;
}

bool Registro::operator<(const Registro &registro) const
{
	vector<Campo>::const_iterator i;
	vector<Campo>::const_iterator j;

	i=this->campos.begin();
	j=registro.campos.begin();

	bool iguales=true;
	bool menor=false;

	while (iguales && !menor && i!=this->campos.end() &&
		j!=registro.campos.end() )
	{
		menor=*i<*j;
		if (!menor)
		{
			iguales=(*i==*j);
			i++;
			j++;
		}
	}

	return menor;
}

void Registro::read(istream &is)
{
	vector<Campo>::iterator i;
	
	for (i=this->campos.begin();i!=this->campos.end();i++)
		i->read(is);
}

void Registro::write(ostream &os) const
{
	vector<Campo>::const_iterator i;
	
	for (i=this->campos.begin();i!=this->campos.end();i++)
		i->write(os);
}

Campo &Registro::operator[](const string &nombreCampo)
{
	int indiceCampo;
	map<string,int>::const_iterator i=this->nombresCampos.find(nombreCampo);

	// En caso de no existir el campo...
	if (i==this->nombresCampos.end())
	{
		// ...se agrega al registro.
		Campo campo;
		this->nombresCampos[nombreCampo]=this->campos.size();
		this->campos.push_back(campo);

		indiceCampo=this->campos.size()-1;
	}
	else
		indiceCampo=i->second;

	Campo &campo=this->campos[indiceCampo];
	return campo;
}

ostream &operator<<(ostream &os,const Registro &registro)
{
	map<string,int>::const_iterator i;
	
	os << "{";

	for (i=registro.nombresCampos.begin();i!=registro.nombresCampos.end();i++)
		os << i->first << "=" << registro.campos[i->second] << ";";

	os << "}";

	return os;
}

void Registro::clear()
{
	this->nombresCampos.clear();
	this->campos.clear();
}

istream &operator>>(istream &is,Registro &registro)
{
	vector<Campo>::iterator i;
	
	for (i=registro.campos.begin();i!=registro.campos.end();i++)
		is >> *i;
	
	return is;
}
